//
// Created by luo on 2022-08-25.
//
#include "../opencv/OpenCv.h"

void QuickDemo::Test_riw(Mat &mat) {
    /*图像读取与显示*/
    //imread("filename",flags); empty()

    //namedWindow("winname",flags); cv::destroyWindow(), cv::destroyAllWindows()
    //WINDOW_NORMAL 允许调整大小 WINDOW_AUTOSIZE 根据图像大小显示窗口

    //imshow("winname",inputimg); 默认是WINDOW_AUTOSIZE创建一个窗口显示图片原始大小
    //waiKey() 等待键盘回应,0表示一直等待，无限显示图片，直到退出，ms为单位

    /*视频加载与摄像头调用*/
    //VideoCapture::VideoCapture(); //默认构造
    //VideoCapture::VideoCapture("filename",apipreference); //属性，编码格式等
    //声明变量的同时将视频数据赋值给变量，可以是视频文件、图像序列或者视频流URL

    //cap.open("1.avi") 利用VideoCapture类创建的cap对象调用open()函数读取1.avi文件
    //cap.isOpened() 进行判断，是否读取视频成功
    // “>>”运算符将图像按照视频顺序将 VideoCapture类赋值给Mat类 empty()判断是否非空
    //cap.get() 输入指定的指令获取视频属性，如尺寸，帧数，帧率等等
    /*
     CAP_PROP_FRAME_WIDTH 3 视频流中图像的宽度   CAP_PROP_FRAME_HEIGHT 4 视频流中图像的宽度
     CAP_PROP_FPS 5 帧率(每秒帧数) CAP_PROP_FOURCC 6 编码器的4字符代码
     */

    /*数据保存*/
    //imwrite("filename",inputimg,params) //params为图片格式属性设置标志
    //预处理
//    CV_Assert(mat.channels() == 4);
//    for(int i = 0; i<mat.rows; i++)
//    {
//        for(int j = 0; j < mat.cols; j++)
//        {
//            Vec4b &bgra = mat.at<Vec4b>(i,j);
//            bgra[0] = UCHAR_MAX; //蓝色通道
//            bgra[1] = saturate_cast<uchar>((float(mat.cols-j))/((float)mat.cols)*UCHAR_MAX);//绿色通道
//            bgra[2] = saturate_cast<uchar>((float(mat.rows-i))/((float)mat.rows)*UCHAR_MAX);//红色通道
//            bgra[3] = saturate_cast<uchar>(0.5*(bgra[1]+bgra[2])); //Alpha通道
//        }
//    }

    /*视频的保存*/
    //VideoWriter()::VideoWriter(); 默认构造函数
    //VideoWriter()::VideoWriter("filename",fourcc,fps,frameSize,isColor);
    /*
     * 路径，压缩帧4字符编解码器代码，帧率(每秒图像的张数),视频帧的尺寸，是否为彩色视频
     * VideoWriter::fourcc('M','J','P','G'); jepg编码
     */
    // "<<"运算符或者write()函数，一帧一帧赋值给视频流
    VideoCapture video(0);
    if (!video.isOpened()) {
//        cout<<"Width:"<<video.get(CAP_PROP_FRAME_WIDTH)<<endl;
//        cout<<"Height:"<<video.get(CAP_PROP_FRAME_HEIGHT)<<endl;
//        cout<<"FPS:"<<video.get(CAP_PROP_FPS)<<endl;
//        cout<<"Count:"<<video.get(CAP_PROP_FRAME_COUNT)<<endl;
        cout << "打开摄像头失败" << endl;
        return;
    }
//    else{
//        cout<<"read frame error!"<<endl;
//    }
    Mat frame;
    video >> frame; //获取图像
    if (frame.empty()) {
        cout << "没有获取到图像" << endl;
        return;
    }
    bool isColor = (frame.type() == CV_8UC3);//判断相机类型是否为彩色
    VideoWriter writer;
    int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
    double fps = 25.0;
    string filename = "live.avi";
    writer.open(filename, codec, fps, frame.size(), isColor);//创建保存视频文件的视频流
    if (!writer.isOpened())//判断视频流是否创建成功
    {
        cout << "打开视频文件失败" << endl;
        return;
    }
    while (1) {
//        video>>frame;
//        if(frame.empty())
//        {
//            break;
//        }
        if (!video.read(frame))//一帧一帧
        {
            cout << "摄像头断开或读取完成" << endl;
            break;
        }
        writer.write(frame);//把图像写入视频流
        //writer<<frame;

        imshow("video", frame);
        char c = waitKey(50);
        if (c == 27) break;
        //waitKey(1000/video.get(CAP_PROP_FPS));
//        cout<<"FPS:"<<video.get(CAP_PROP_FPS)<<endl;
//        cout<<"Count:"<<video.get(CAP_PROP_FRAME_COUNT)<<endl;
        //waitKey(1);
    }
    //退出时自动关闭视频流
    video.release();
    writer.release();
    //return;

    //保存和读取XML和YMAL文件
    //XML是一种元标记语言，根据自身需求定义自己的标记
    //<age>25</age> <color>blue</color> <color><red>150</red></color>
    //YAML是一种以数据为中心的语言, "变量:数值"的形式来表示每个数据的数值
    //FileStorage("filename",flags,encoding);
}
